import axios from 'axios'
import { ElMessage } from 'element-plus'
import router from '@/router'

// 创建 axios 实例
const service = axios.create({
  baseURL: '',
  timeout: 30000,
  withCredentials: true,
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'X-Requested-With': 'XMLHttpRequest'
  }
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 打印请求信息
    console.log('发送请求:', {
      url: config.url,
      method: config.method,
      params: config.params,
      data: config.data,
      headers: config.headers
    })

    // 从 localStorage 获取 token
    const token = localStorage.getItem('token')
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`
    }

    // 添加必要的请求头
    if (config.method === 'post' || config.method === 'put') {
      config.headers['Content-Type'] = 'application/json'
    }

    return config
  },
  error => {
    console.error('请求配置错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 打印响应信息
    console.log('收到响应:', {
      url: response.config.url,
      status: response.status,
      data: response.data,
      headers: response.headers
    })

    const res = response.data
    
    // 检查响应状态码
    if (response.status !== 200) {
      const message = res?.message || '请求失败'
      console.error('HTTP状态码错误:', {
        url: response.config.url,
        status: response.status,
        message: message,
        data: res
      })
      ElMessage.error(message)
      return Promise.reject(new Error(message))
    }

    // 检查是否是登录或注册接口
    const isAuthEndpoint = response.config.url.includes('/api/auth/')
    if (isAuthEndpoint) {
      // 如果是登录接口，保存token
      if (response.config.url.includes('/login') && res.token) {
        localStorage.setItem('token', res.token)
      }
      return res
    }

    // 检查业务状态码和数据格式
    if (!res) {
      // 对于删除操作，空响应也是成功的标志
      if (response.config.method === 'delete') {
        console.log('删除操作成功（空响应）')
        return {
          code: 200,
          message: 'success',
          data: null
        }
      }
      
      // 对于创建操作，空响应也视为成功
      if (response.config.method === 'post') {
        console.log('创建操作成功（空响应）')
        return {
          code: 200,
          message: 'success',
          data: null
        }
      }
      
      const message = '返回数据为空'
      console.error('响应数据错误:', message)
      ElMessage.error(message)
      return Promise.reject(new Error(message))
    }

    // 处理不同的响应格式
    if (res.code !== undefined) {
      // 标准响应格式：{ code: number, data: any, message: string }
      if (res.code === 200) {
        console.log('标准格式响应成功:', res)
        return res
      } else {
        const message = res.message || '请求失败'
        console.error('业务处理失败:', message)
        ElMessage.error(message)
        return Promise.reject(new Error(message))
      }
    } else {
      // 直接返回数据的格式
      console.log('非标准格式响应，包装数据:', res)
      const wrappedResponse = {
        code: 200,
        data: Array.isArray(res) ? {
          records: res,
          total: res.length
        } : res,
        message: 'success'
      }
      console.log('包装后的响应:', wrappedResponse)
      return wrappedResponse
    }
  },
  error => {
    // 详细的错误信息记录
    console.error('请求失败:', {
      url: error.config?.url,
      method: error.config?.method,
      params: error.config?.params,
      data: error.config?.data,
      status: error.response?.status,
      statusText: error.response?.statusText,
      headers: error.response?.headers,
      errorData: error.response?.data,
      message: error.message
    })

    // 根据错误类型返回友好的错误提示
    let message = '请求失败'
    if (error.response) {
      switch (error.response.status) {
        case 400:
          message = error.response.data?.message || '请求参数错误'
          break
        case 401:
          message = '登录已过期，请重新登录'
          localStorage.removeItem('token')
          router.push('/login')
          break
        case 403:
          message = '没有权限访问该资源'
          break
        case 404:
          message = '请求的资源不存在'
          break
        case 500:
          message = error.response.data?.message || '服务器内部错误'
          break
        default:
          message = error.response.data?.message || `请求失败(${error.response.status})`
      }
    } else if (error.request) {
      message = '服务器无响应'
    } else {
      message = error.message
    }

    ElMessage.error(message)
    return Promise.reject(error)
  }
)

export default service 